/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cliente.codigo;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 *
 * @author Richiely Batista
 */
public class Cliente extends Thread{
    
    int porta = 7000;
    String servidor = "localhost";
    String diretorio = System.getProperty("user.dir") + File.separator + "recebidos" + File.separator;//"C:/Users/Gean Delon/Documents/NetBeansProjects/Client/Recebidos/";
    Socket socket;
    private DataInputStream input;
    private DataOutputStream output;
    char[] comandos;
    String[] arquivos;

    public Cliente(String pServidor, int pPorta,char[] comandos, String[] arquivos) {
        this.servidor = pServidor;
        this.porta = pPorta;
        this.socket = null;
        this.comandos = comandos;
        this.arquivos = arquivos;
    }
    
  @Override
    public void run() {
        try {
            socket = new Socket(this.servidor, this.porta);
            output = new DataOutputStream(socket.getOutputStream());  // escrever dados no canal
            input = new DataInputStream(socket.getInputStream()); // receber dados do canal 
            
            // Recebe mensagem  
            System.out.println(input.readUTF());

            // um mecanismo para idenficar os comandos
            // vetores com comandos e arquivos

            char op;
            String file;
            int i;
            for (i = 0; i < comandos.length; i++) {
                op = comandos[i];
                file = arquivos[i];
                switch (op) {
                    case 'P':
                        output.writeUTF("PUT;" + file);
                        enviandoParaServidor(file);
                        break;

                    case 'G':
                        output.writeUTF("GET;" + file); // efetuando um get
                        recebendoDoServidor();
                        break;
                    //case 'S':
                    //output.writeUTF("SAIR");
                    default:
                        break;
                }
            }

            output.writeUTF("SAIR");

        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    private void recebendoDoServidor() throws IOException {

        String nomeArquivo = this.input.readUTF();

        if (nomeArquivo != null) {
            long size = this.input.readLong();
            System.out.println("Recebendo arquivo: " + nomeArquivo + " - " + size + " bytes.");

            // Verifica se tem a pasta de destino criada, caso nao tenha ele cria  
            File arquivo = new File(diretorio);
            if (arquivo.exists() == false) {
                arquivo.mkdir();
            }

            FileOutputStream fos = new FileOutputStream(diretorio + nomeArquivo);
            InputStream in = this.socket.getInputStream();

            int tamanho = 4096; // tamanho do buffer: 4KB
            byte[] buffer = new byte[tamanho];
            int lidos = -1;
            long tempo = System.currentTimeMillis();

            int tlidos = 0;
            while (tlidos < size) {
                lidos = in.read(buffer, 0, tamanho);
                fos.write(buffer, 0, lidos);
                tlidos += lidos;
            }
            tempo = System.currentTimeMillis() - tempo;
            System.out.println( nomeArquivo + " recebido com sucesso em: " + tempo / 1000f + " segundos");
            fos.flush();
            
        }
    }

    private void enviandoParaServidor(String pNomeDoArquivo) throws IOException {

        File arquivo = new File(diretorio + pNomeDoArquivo);
        if (arquivo.exists()) {

            System.out.println("Transferindo o arquivo: " + arquivo.getName());
            this.output.writeUTF(arquivo.getName());
            this.output.writeLong(arquivo.length());

            FileInputStream in = new FileInputStream(arquivo);
            OutputStream os = this.socket.getOutputStream();

            int tamanho = 4096; // tamanho do buffer: 4KB
            byte[] buffer = new byte[tamanho];
            int lidos = -1;
            long tempo = System.currentTimeMillis();
            
            while ((lidos = in.read(buffer, 0, tamanho)) != -1) {
                os.write(buffer, 0, lidos);
            }
            tempo = System.currentTimeMillis() - tempo;
            System.out.println( pNomeDoArquivo + " enviado com sucesso em: " + tempo / 1000f + " segundos");
            os.flush();
        } else {
            System.out.println("NÃ£o existe o arquivo!");
            System.exit(1);
        }
    }

    
}
